import { fileURLToPath, URL } from 'node:url';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueDevTools from 'vite-plugin-vue-devtools';
import Pages from 'vite-plugin-pages';
import Inspect from 'vite-plugin-inspect';
import AutoImport from 'unplugin-auto-import/vite';
import Components from 'unplugin-vue-components/vite';

// https://vite.dev/config/
export default defineConfig({
  server: {
    port: 5174,
  },
  plugins: [
    vue(),
    vueDevTools(),
    // 自动生成路由
    Pages({
      dirs: 'src/views',
      extensions: ['vue'],
      exclude: ['**/components/**'],
      extendRoute(route) {
        // 将 /index 路由重定向到 /
        if (route.path === '/index') {
          return {
            ...route,
            path: '/',
            alias: '/index'
          };
        }
        return route;
      }
    }),
    // 开发时的构建分析工具
    Inspect(),
    // 自动导入 Vue 相关函数
    AutoImport({
      imports: [
        'vue',
        'vue-router',
        'pinia',
        '@vueuse/core'
      ],
      // 生成 TypeScript 声明文件
      dts: 'src/auto-imports.d.ts',
      // 生成 .eslintrc-auto-import.json 文件
      eslintrc: {
        enabled: true
      }
    }),
    // 自动导入组件
    Components({
      dirs: ['src/components'],
      extensions: ['vue'],
      dts: 'src/components.d.ts'
    })
  ],
  css: {
    preprocessorOptions: {
      less: {
        javascriptEnabled: true,
        additionalData: '@import "@/styles/fonts.less";'
      }
    }
  },
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    },
  },
  define: {
    'process.env.VITE_API_BASE_URL': JSON.stringify(process.env.VITE_API_BASE_URL)
  },
  // 优化构建配置
  build: {
    // 启用 CSS 代码分割
    cssCodeSplit: true,
    // 启用源码映射
    sourcemap: false,
    // 自定义 rollup 配置
    rollupOptions: {
      output: {
        // 分包策略
        manualChunks: {
          'vue-vendor': ['vue', 'vue-router', 'pinia'],
          'utils': ['lodash-es', 'dayjs'],
          'ui': ['@vueuse/core', '@vueuse/motion']
        }
      }
    }
  }
});
